package com.sky.service;



import com.sky.dto.*;
import com.sky.result.PageResult;
import com.sky.vo.OrderPaymentVO;
import com.sky.vo.OrderStatisticsVO;
import com.sky.vo.OrderSubmitVO;
import com.sky.vo.OrderVO;

/**
 * @author Morpeko
 * @description 针对表【orders(订单表)】的数据库操作Service
 * @createDate 2024-08-17 20:49:57
 */
public interface OrdersService {

    /**
     * 用户下单
     *
     * @param orderSubmitDTO
     * @return
     */
    OrderSubmitVO submitOrder(OrdersSubmitDTO orderSubmitDTO);

    /**
     * 订单支付
     * @param ordersPaymentDTO
     * @return
     */
    OrderPaymentVO payment(OrdersPaymentDTO ordersPaymentDTO) throws Exception;

    /**
     * 支付成功，修改订单状态
     * @param outTradeNo
     */
    void paySuccess(String outTradeNo);

    /**
     * 查询用户的历史订单数据
     * @param ordersPageQueryDTO
     * @return
     */
    PageResult historyOrders(OrdersPageQueryDTO ordersPageQueryDTO);

    /**
     * 根据订单id查询订单详情
     * @param id
     * @return
     */
    OrderVO orderDetail(Long id);

    /**
     * 根据订单id取消订单
     * @param id
     */
    void cancelOrder(Long id) throws Exception;

    /**
     *
     * 根据订单id再次下单
     * @param id
     */
    void repetitionOrder(Long id);

    /**
     * 催单--根据订单id催单
     * @param id
     */
    void reminder(Long id);

    /**
     * 根据订单号,用户手机号,订单状态,下单开始时间,下单结束时间进行条件分页查询
     * @param ordersPageQueryDTO
     * @return
     */

    PageResult pageQueryByCondition(OrdersPageQueryDTO ordersPageQueryDTO);

    /**
     * 实现根据订单状态统计各种状态的订单数量
     * @return
     */
    OrderStatisticsVO statistics();

    /**
     * 根据订单id查询订单详情
     * @param id
     * @return
     */
    OrderVO queryOrderDetails(Long id);

    /**
     * 接单-修改订单状态为待派送
     * @param id
     */
    void confirm(OrdersDTO id);

    /**
     * 拒单-修改订单状态为退款,支付状态为退款,更新拒单原因
     * @param ordersRejectionDTO
     */
    void rejection(OrdersRejectionDTO ordersRejectionDTO) throws Exception;

    /**
     * 订单取消-根据订单ID和订单取消原因修改订单状态为取消,修改取消时间,修改取消原因,修改支付状态为退款
     * @param ordersCancelDTO
     */
    void cancel(OrdersCancelDTO ordersCancelDTO) throws Exception;

    /**
     * 根据订单id修改订单状态为派送中
     * @param id
     */
    void delivery(Long id);

    /**
     * 订单完成:根据订单id修改订单状态为完成,送达时间为当前时间
     * @param id
     */
    void complete(Long id);
}
